בחלק זה נסביר כיצד ליצור טבלאות בלארבל בשימוש עם migration ,יצירת החלק של המודל בשלושת השכבות וכיצד ניתן להוציא את הנתונים מן המודל ע"י שימוש בקונטרולר.
בחלק 1 הסברנו כיצד ליצור את הקונטרולר וכיצד ניתן להעביר מידע ממנו אל ה view שלנו.
במדריך זה נלמד כיצד ליצור את החיבור מול המסד נתונים וכיצד ניתן לקבל נתונים מהמודל לקונטרולר.
על מנת להתחיל יהיה צורך ב mysql מותקן.[אם כי אפשר גם להשתמש בכל מסד אחר שנתמך ע"י laravel]
הגדרת המסד
אז ניגש לעניינים,נפתח קודם כל את קובץ ההגדרות שלנו [נמצא בתיקייה הראשית - .env] ונשנה את הפרטים הבאים -
DB_HOST=localhost
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
יצירת טבלה חדשה
כעט ניצור את הטבלאות הראשונות,מאחר ו laravel מגיעה כבר עם טבלת משתמשים וטבלת "שכחתי סיסמא" אין צורך ליצור אותם אך במידה ותרצו להוסיף שדות נוספים תמיד אפשר לעשות זאת ע"י שינוי הקובץ - database\migrations\2014_10_12_000000_create_users_table.php
ניצור אחת משלנו עבור "מוצרים". נריץ את הפקודה -
php artisan make:migration create_products_table
במידה והכל עבר כמו שצריך אמור להיווצר לכם קובץ חדש בתיקיה migrations.
פונקציית ה up רצה כאשר אנחנו מבצעים את ה migration כלומר בפונקציה up נכניס את הקוד שאנחנו רוצים שייצור את הטבלה \ יבצע את השינויים בטבלה.
הפונקציה down לעומת זאת תתבצע מתי שנבצע rollback או reset ל migrations . כלומר שם נכניס את הקוד שמבצע את הפעולה ההפוכה למה שעשינו ב up - אם יצרנו טבלה ב up אז ב down אנחנו נמחק אותה.
אותו רעיון עובד אם החלטנו להוסיף שדה חדש דרך migration לטבלה מסויימת אז בפונקציה down נדאג למחוק את אותו שדה.
ניצור את פונקציית ה up -
public function up()
{
Schema::create('products', function (Blueprint $table) {
$table->increments('id');//מפתח ראשי
$table->string('name');//שם המוצר
$table->decimal('price', 10, 2);//מחיר
$table->softDeletes();
});
}
{
Schema::create('products', function (Blueprint $table) {
$table->increments('id');//מפתח ראשי
$table->string('name');//שם המוצר
$table->decimal('price', 10, 2);//מחיר
$table->softDeletes();
});
}
ופונקציית down -
public function down()
{
Schema::drop('products');
}
{
Schema::drop('products');
}
*מידע נוסף על יצירת עמודות והסוגים שניתן להוסיף אפשר למצוא בתיעוד הרשמי
כעט נריץ את ה migrations ע"י הפקודה -
php artisan migrate
הכנסת נתונים למסד
ניצור seeder על מנת להכניס מספר מוצרים לטבלה שלנו.
*במדריך זה לא אסביר על שימוש ב model factory עם faker אם כי כאשר מדובר בכמות גדולה של נתונים שאנו רוצים לבדוק עליה יהיה עדיף לשלב בין שני אלו מאשר לכתוב ידנית את הנתונים.מידע על כך ניתן למצוא גם כן בתיעוד הרשמי
נריץ את הפקודה -
php artisan make:seeder Add_some_products
ונפתח את הקובץ שנוצר לנו בתיקייה seeds.
נשנה את הפונקציה run שתראה כך -
public function run()
{
DB::table('products')->insert([
[
'name' => 'Product A',
'price' => 50.20
],
[
'name' => 'Product B',
'price' => 32.90
],
[
'name' => 'Product C',
'price' => 5.00
],
[
'name' => 'Product D',
'price' => 500.10
]
]);
}
{
DB::table('products')->insert([
[
'name' => 'Product A',
'price' => 50.20
],
[
'name' => 'Product B',
'price' => 32.90
],
[
'name' => 'Product C',
'price' => 5.00
],
[
'name' => 'Product D',
'price' => 500.10
]
]);
}
על מנת להכניס את הנתונים כעט לטבלה נריץ את ה seeder ע"י הפקודה -
php artisan db:seed --class=Add_some_products
יצירת המודל
ביצירה של הנתונים השתמשנו במחלקה DB על מנת להוסיף את הנתונים אך כעט נכיר כלי אחר של לארבל שמאפשר לנו לבצע פעולות בצורה טיפה נוחה יותר הנקרא Eloquent.
מידע נוסף על eloquent ניתן למצוא בתיעוד הרשמי
ניצור את המודל ע"י הפקודה -
php artisan make:model Product
נפתח כעט את הקובץ שנוצר ב app/Product.php.
ונכניס את הקוד הנ"ל -
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
protected $table = 'products';
protected $fillable = ['name','price'];
public $timestamps = false;
}
namespace App;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
protected $table = 'products';
protected $fillable = ['name','price'];
public $timestamps = false;
}
מה שהוגדר כאן הוא קודם כל שם הטבלה - products.
לאחר מכן הגדרנו אילו שדות ניתנים למילוי - name,price.
ולבסוף הגדרנו שאין את השדות created_at ו updated_at.
כעט נוכל לחזור לקונטולר שלנו ולבצע פעולות מול המסד.
נמחק קודם כל את כל הנתיבים שכתבנו בחלק 1 וניצור מחדש נתיב בשם products כך -
Route::get('products','MyController@index');
ונשנה את המתודה index שתוציא לנו את כל המוצרים שקיימים -
public function index(){
return \App\Product::all();
}
return \App\Product::all();
}
מכאן תוכלו לשחק עם זה חופשי,אני מקווה שהמדריך עזר לכאלו שרק התחילו להבין את הבסיס לעבודה בין שלושת השכבות ושבעתיד יצא לי לכתוב הסברים לדברים קצת יותר מתקדמים שניתן לעשות עם הפריימוורק.
תודה רבה ל @Ben שהסב את תשומת ליבי על כתיבה של חלק 2 ,לגמרי שכחתי מהמדריך שנכתב לפני יותר משנה.
תגובות לכתבה:
תודה רבה לך, אין על מה :)
תודה על המדריך :)